package cn.ffcs.base.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.criterion.Criterion;

import cn.ffcs.base.model.BaseEntity;
import cn.ffcs.base.web.PageControl;
import cn.ffcs.util.ext.Expression;

/**
 * DAO基础代码<br/>: 新增、修改、删除、基本查询操作
 * <table>
 * <tr>
 * <td>负责人/principal:</td>
 * <td colspan="2">liuzhh</td>
 * <tr>
 * <td>修改记录/revision:</td>
 * <td colspan="2"></td>
 * </tr>
 * <tr>
 * <td>日期:</td>
 * <td>修改人:</td>
 * <td>修改说明:</td>
 * </tr>
 * <tr>
 * <td></td>
 * <td></td>
 * <td></td>
 * </tr>
 * </table>
 * @author liuzhh
 * @version $Id$
 */
public interface IBaseDAO<B extends BaseEntity> extends IExtendHibernateDaoSupport
{
    /**
     * 获取实体类
     * @return
     */
    public abstract String getEntityName();
    
    /**
     * 用于数据保存
     * @param baseEntity
     */
    public abstract void save(B baseEntity);
    
    public abstract void merge(B baseEntity);

    /**
     * 用于删除实体数据
     * @param baseEntity
     */
    public abstract void delete(B baseEntity);
    
    /**
     * 根据ID进行删除
     * @param id
     */
    public void deleteById(String id);
    
    /**
     * 执行逻辑删除
     * @param entityName
     * @param param
     * @param paramValue
     */
    public void remove(String entityName);
    
    /**
     * 根据唯一键值获取实体
     * @param id
     * @return
     */
    public abstract B findById(Integer id);

    /**
     * 修改实体数据
     * @param baseEntity
     */
    public abstract void update(B baseEntity);

    /**
     * 获取所有同类实体数据
     * @return
     */
    public abstract List<B> findAll();
    
    /**
     * 
     * 取一定数据
     * @param num
     * @return
     */
    public List<B> findAll(int num,final String orderParam);
    
    /**
     * 按查询条件获取总数
     * @return
     */
    public List<B> findBy(Criterion cond);
    
    /**
     * 
     * 按查询条件获取总数并按照排序字段进行排序
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<B> findByAndOrder(Criterion cond,String orderParam,String strOrder);
    
    /**
     * 得到分页数据
     * @return
     */
    public PageControl findByPage(Criterion cond,int currPage, int pageSize);
    public PageControl findByPage(Expression exp,int currPage, int pageSize);
    
    /**
     * 获取所有同类实体数据并实现翻页
     * @param currPage
     * @param pageSize
     * @return
     */
    public PageControl findAllByPage(int currPage, int pageSize);
    /**
     * 获取数据库当前时间
     * @param sequenceName
     * @return
     */
    public abstract Date getCurrSysdate();
    /**
     * 获取数据库中seq的nextval
     * @param sequenceName
     * @return
     */
    public abstract String getNextval(String seqName);
}
